#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"anomalie.h"
#include"personnel.h"
#include"patient.h"





/*******************************/
/*cette fonction permet de determiner si le capteur est dans la zone du
Parcoure a suivre ou pas ou si c'est le capteur thermique d'ebola*/
int tester_capteur(char cap[])
{int n1,n2,n3,n4,n5;
 n1=strcmp(cap,"B01");n2=strcmp(cap,"M01");n3=strcmp(cap,"Sout");n4=strcmp(cap,"Pout");
n5=strcmp(cap,"Ebola");
if(n1==0||n2==0||n3==0||n4==0)//si le capteur est en dehors du parcoure a suivre
  return 0;
else if(n5==0)//si c'est le capteur thermique d'ebola
 return -1;
else
return 1;//si le capteur est dans la zone du parcoure
}



/*cette fonction permet de detrminer si le parour d'un identifiant est deja definie ou pas*/
int chercher_parcoure(Parcoure t[],int n,long int  id)
{int i=0;
while(t[i].ide!=id&& i<n)//chercher si le parcoure est define 
i++;
  if(t[i].ide==id)  
return i;//si le parour de l'identifiant est déja definie
  else if(t[i].nbre!=-1)
return -1;//si l'identfiant est declarer suspecter d'ebola
else
return -2;
}





/*cette fonction permet de remplir les parours de tous les identifiant existant dans le fichier Event*/
void remplir_mvt_camp(char Event[],Parcoure t[],int*n)
{char c[20];int n1,n2;long int I;char s[20];
FILE *f;
f=fopen(Event,"r");
if(f!=NULL)//si le fichier est ouvert
{
  while(fscanf(f,"%s %ld %s",c,&I,s)!=EOF)//tant que le fichier n'est pas encore finie
  {
	n1=chercher_parcoure(t,*n,I);//verifier si le parcour de l'identifiant extrait du fichier existe deja ou pas
	n2=tester_capteur(s);//verifier si le capteur appartient au zone du parcoure ou pas
	if(n1==-1 && n2==1)//parcour non definie avant && capteur dans la zone 
    {
    t[*n].ide=I;
    strcpy((t[*n].mvt),s);
    (t[*n].nbre)=(t[*n].nbre)+1;
    *n=*n+1;
    }
    else if(n1==-1 && n2==-1)//parcour non definie avant && identifiant suspecter d'ebola
     {
        t[*n].nbre=-1;
        *n=*n+1;
    }
	else if(n1!=-1 && n2==1)//parcour definie avant &&capteur dans la zone
	    {
	     strcat(t[n1].mvt,s);
	     t[n1].nbre=t[n1].nbre+1;
            }
       if(t[*n].nbre/10==9)//si le nombre du capteur comptée est arrivée au max qui est 9 pour chaque passage du parcour
       t[n1].nbre=t[n1].nbre+1;
        }

   }
else
printf("\n impossible d ouvrire le fichier Event.txt");
fclose(f);
}




/*cette fonction permet de verifier le parcour si c'est normale ou pas*/
int tester_chaine(Parcoure t)
{int i,j,n=0;char ch[50];char ch1[50]="E01C01S01L01L02C02V0&I01D01B01";
for(i=0;i<=t.nbre;i++)//verifier chaque passage du parcour
{j=0;
while(j<27)
{ch[j]=t.mvt[n];//extraire le parcoure fait a chaque passage
j++;
n++;
}
n++;
ch[n]='\0';
if(strcmp(ch,ch1)!=0)
return -1;//si le parcoure n'est pas comme celui qui est prédefinie
}
return 0;//si le parcour est regler
}



/*determine si il y a une anomalie concernant un identifiant précis*/ 
void tester_parcoure(Parcoure p, char ch[50],Personnel t[],int n2)
{int n;

 n=rechercher_personnel(t,p.ide,n2);//verifier si l'identifiant est celui d'un personnel
   if(n==-1)
   strcpy(ch,"Patient");//si ce n'est pas un personnel
  else
{
   if(p.nbre==-1)//si l'identifiant est suspecter d'etre infecter d'ebola
    strcpy(ch,"Ebola");
   if(p.nbre/10!=9)//si le nombre des capteur est diff"rent de celui qui est normale
    strcpy(ch,"capteur_manque");
    else
     { n=tester_chaine(p);//tester le parcour
       if(n==0)
         strcpy(ch,"normale");//si le parour est normale
         
       else
         strcpy(ch,"innormale");//si le parcour est innormale
      }     

}

}

/*vrifier tous les parcours si il sont normale ou pas*/
void detecter_alerte(Parcoure t[],int n,Anomalie t1[],int *n1,Personnel pers[],Patient pat[],int pe,int pa)
{ int i;char ch[50];
for(i=0;i<n;i++)
{ if(rechercher_personnel(pers,t[i].ide,pe)!=-1)//si l'identifant est celui d' un personnel
 {
     tester_parcoure(t[i],ch,pers,pe);
     if(strcmp(ch,"normale")!=0)//si le parcoure n'est pas normale
  {
    t1[*n1].ide=t[i].ide;
    strcpy(t1[*n1].type,ch);
    *n1=*n1+1;
  }
}
else if(rechercher_Patient(pat,pa,t[i].ide)!=-1)//si l'identifiant est celui d'un patient
   strcpy(ch,"patient");
else
strcpy(ch,"innconnue");//sinon c'est un inconnue qui a circuler dans la zone d'isolation
}
}


/*permet d'afficher le parcour d'un identifiant bien precis*/
void afficher_parcour(char Event[30], long int ide)
{char c[20];long int I;char s[30];
FILE*f;
f=fopen(Event,"r");
if(f!=NULL)
{ while(fscanf(f,"%s        %ld        %s",c,&I,s)!=EOF)
   {
	if( I==ide)//si les données correspand à l'identifiant rechercher
	 printf("\n l'identifiant %ld a ete au niveau du capteur %s au %s ",I,s,c);
 }
}
else
printf("\nImpossible d ouvrire le fichier event.txt");
fclose(f);
}
/*permet d'afficher les parcours de tous les personnels présents*/
void afficher_parcoure_personnel(char Event[],int n,Personnel t1[])
{int i;
for(i=0;i<n;i++)
{
afficher_parcour(Event,t1[i].ide);
printf("\n");
}
}

/*permet d'afficher les alertes detecter par le programme*/
void afficher_alerte(Anomalie t[],int n,char Event[])
{//afficher tout les alertes
int i;
for(i=0;i<n;i++)
{ printf("\n\nID:%ld",t[i].ide);
  printf("\ntype d anomalie: %s",t[i].type);
  printf("\nson parcour aujourdhui:");
  afficher_parcour(Event,t[i].ide);
}

}
/*permet de supprimer une anomalie aprés qu'elle sera traitée*/
void supprimer_anomalie(Anomalie t[],int *n,int i)
{int j;
for(j=i;j<*n-1;j++)
t[j]=t[j+1];
*n=*n+1;
}
/*permet la gestion d'une anomalie d'un identifiant précis*/

void gestion_anomalie(Anomalie t[],int *n,Personnel pers[],int* n1,Patient pat[],int* n2,long int ide)
{int i;char c[20];Patient p;
while(i<*n&&t[i].ide!=ide)
i++;
if(t[i].ide!=ide)
printf("l identifiant n a  pas d anomalie");
else
{
     if(strcmp(t[i].type,"patient")==0||strcmp(t[i].type,"innconnue")==0)
      {
        printf("\n cette anomalie est elle traitee");
         scanf("%s",c);
        if(strcmp(c,"oui")==0)
        supprimer_anomalie(t,n,i);
      }
    else
      {
        printf("\n Ce personnel est-il infectee ");
        scanf("%s",c);
        if(strcmp(c,"oui")==0)
         {
          supprimer_personnel(pers,n1,ide);
          printf("\nveuillez retapez ses données pour le transformer en patient");
          saisir_patient(&p);
          enrigistrer_patient(pat,n2,p);
          supprimer_anomalie(t,n,i);
          printf("\n lanomlie est traitee");
          }
        }
}
}
/*permet de dtecter les personnel absent dans la journée*/
void afficher_absences(Parcoure t[],int n,Personnel pers[],int n1)
{int i,n2,absence=0;
for(i=0;i<n1;i++)
{
n2=chercher_parcoure(t,n,pers[i].ide);
if(n2==-1)//si pour l'identifiant na pas de parcour definie
{
printf("\nle personnel %ld a ete absent durant la journee",pers[i].ide);
absence=1;
}
}
if(absence==0)//si il n'y a pas d'abscence 
printf("\nil n avait pas d abscence durant toute la journee");
}


